package main

import (
	"flag"
	"fmt"
	"html/template"
	"os"
	"src/src/utils"
	"time"
)

var(
	NsName = flag.String("nsName","FoxGame.Network.Protocal","命名空间")
	ProtoDir = flag.String("protoDir","./proto","proto存放目录")
	Output = flag.String("output","./","输出目录")
)


//生成模板
var csharpTemplate =
`
// 该文件自动生成，请勿手动修改!!!
// 生成时间: {{.GenerateTime}}	
// - by fox


namespace {{.NsName}} {
	//协议号定义
	public class ProtocolId{
		{{ range .Infos}}
		public const int {{.ProtocolName}} = {{.ProtocolID}} ;
		{{ end }}
	}

	//协议号扩展函数
	{{ range .Infos}}
	public partial class {{.ProtocolName}} {
		public int GetProtocolID(){ return ProtocolId.{{.ProtocolName}} ; }
	}
	{{ end}}

	//协议辅助函数
	public static class ProtocolHelper{
		public static Google.Protobuf.IMessage Parse(int protocolId,byte[] data){
			switch(protocolId){
				{{range .Infos}}
				case ProtocolId.{{.ProtocolName}} : return {{.ProtocolName}}.Parser.ParseFrom(data);
				{{end}}
			}
			return null;
		}

	}
}

`


func main(){
	flag.Parse()

	allProtoFiles := utils.FilterFile(*ProtoDir)
	fmt.Println("搜索到的proto文件:")
	fmt.Println(allProtoFiles)

	parseInfo:=utils.ParseInfo{}
	parseInfo.NsName = *NsName
	parseInfo.GenerateTime = time.Now().String()
	parseInfo.Infos = make([]utils.ProtocolInfo,0)
	for i:=0;i<len(allProtoFiles);i++{
		pinfos:= utils.ParseProto(allProtoFiles[i])
		if len(pinfos) >0{
			parseInfo.Infos = append(parseInfo.Infos,pinfos...)
			fmt.Println("解析文件成功:" + allProtoFiles[i])
		}
	}

	saveCsharpFile(&parseInfo,*Output)
}


func saveCsharpFile(info *utils.ParseInfo , outputPath string){
	tmpl,err:=template.New("cs").Parse(csharpTemplate)
	utils.CheckErr(err)

	os.Remove(outputPath)
	file,err:=os.OpenFile(outputPath,os.O_CREATE | os.O_WRONLY, 0755)
	utils.CheckErr(err)

	err = tmpl.Execute(file,info)
	utils.CheckErr(err)
}



